package com.example.controller;

import com.example.common.R;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.UUID;

@RestController
@RequestMapping("/upload")
@CrossOrigin("http://localhost:8080")
public class CommonController {
    @Value("${filePath}")
    String path;
    @PostMapping
    public R<String> upload(MultipartFile file){
        //获取原始文件名称
        String OriginalFileName = file.getOriginalFilename();
        //截取文件后缀
        String suffix = OriginalFileName.substring(OriginalFileName.lastIndexOf("."));
        //防止重名
        String fileName = UUID.randomUUID()+suffix;
        File f = new File(path);
        //路径是否存在,不存在,创建
        if (!f.exists()){
            f.mkdirs();
        }
        try {
            //转存文件
            file.transferTo(new File(path+fileName));
        } catch (IOException e) {
            //打印错误位置及原因
            e.printStackTrace();
        }
        return R.success(fileName);
    }
    @GetMapping("/download/{name}")
    public void download(@PathVariable String name, HttpServletResponse response){
        try {
            //输入流，通过输入流将文件读取
            FileInputStream fileInputStream = new FileInputStream(new File(path+name));
            //输出流，通过输出流把文件传给浏览器
            ServletOutputStream servletOutputStream = response.getOutputStream();
            //设置文件的格式为只能图片的格式
            response.setContentType("image/jpeg");
            int len = 0;
            //创建一个含有1024个元素的数组
            byte[] bytes = new byte[1024];
            //从本地的文件读取数据并赋值给len
            while ((len = fileInputStream.read(bytes)) != -1){
                //输出流往外写,第一个参数为要写入的字节数组，第二个为从数组的什么位置开始写
                //如果off为0，len为数组长度，则会将整个字节数组写入输出流。
                servletOutputStream.write(bytes,0,len);
                //刷新输出流，确保可以正确写入，如果不刷新有可能不能正常写入
                servletOutputStream.flush();
            }
            //关闭资源
            fileInputStream.close();
            servletOutputStream.close();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}
